package br.ufmt.model;

import java.util.ArrayList;

import br.ufmt.exception.ObraException;

/**
 * Classe para armazenar dados da Obra Audiovisual
 * @author jppreti
 *
 */
public class Obra {

	public static ArrayList<Obra> obras = new ArrayList<Obra>();
	
	/**
	 * descreve o nome da Obra
	 */
	private String titulo;
	private String imagem;
	/**
	 * breve resumo da obra
	 */
	private String descricao;
	/**
	 * @see locadora.Rotulo
	 */
	private Rotulo rotulo;
	private String id;
	
	public Obra(String titulo, String descricao, Rotulo rotulo) throws ObraException {
		setTitulo(titulo);
		setDescricao(descricao);
		setRotulo(rotulo);
		setID();
	}
	
	public Obra(String id, String titulo, String descricao, Rotulo rotulo, String imagem) throws ObraException {
		setTitulo(titulo);
		setDescricao(descricao);
		setRotulo(rotulo);
		setID(id);
		setImagem(imagem);
	}

	

	public String getImagem() {
		return imagem;
	}

	public void setImagem(String imagem) {
		this.imagem = imagem;
	}

	private void setID(String id2) {
		id = id2;
		
	}

	private void setID() {
		id = Integer.toString(this.hashCode());
		
	}
	

	public static ArrayList<Obra> getObras() {
		return obras;
	}

	public static void setObras(ArrayList<Obra> obras) {
		Obra.obras = obras;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getTitulo() {
		return titulo;
	}

	public String getDescricao() {
		return descricao;
	}

	public Rotulo getRotulo() {
		return rotulo;
	}

	public void setTitulo(String titulo) throws ObraException {
		if (titulo==null || titulo.length()==0) throw new ObraException(ObraException.TITULO_OBRIGATORIO);
		if (titulo.length()<5) throw new ObraException(ObraException.TITULO_TAMANHO);
		this.titulo = titulo;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public void setRotulo(Rotulo rotulo) throws ObraException {
		if (rotulo == null) throw new ObraException(ObraException.ROTULO_OBRIGATORIO);
		this.rotulo = rotulo;
	}
	
	/**
	 * Guarda uma refer�ncia do objeto em um vetor
	 */
	public void salvar() {
		if (!obras.contains(this))
			obras.add(this);
	}
	
	/**
	 * Exclui a refer�ncia do objeto do vetor
	 */
	public void excluir() {
		obras.remove(this);
	}
	
	/**
	 * Busca obra baseado no nome
	 * @param nome nome da obra a ser localizada
	 * @return objeto Obra
	 */
	public static Obra getObraPorNome(String nome) {
		for (Obra o: obras) {
			if (o.getTitulo().equalsIgnoreCase(nome)) return o;
		}
		return null;
	}
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((titulo == null) ? 0 : titulo.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Obra other = (Obra) obj;
		if (titulo == null) {
			if (other.titulo != null)
				return false;
		} else if (!titulo.equalsIgnoreCase(other.titulo))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return getTitulo();
	}
	
	static {
		try {
			new Obra("Immortals","",Rotulo.getRotuloPorNome("Super Lançamento")).salvar();
			new Obra("Fúria de Titãns 2","",Rotulo.getRotuloPorNome("Super Lançamento")).salvar();
			new Obra("Fúria de Titãns ","",Rotulo.getRotuloPorNome("Lançamento")).salvar();
			new Obra("Matrix 1","",Rotulo.getRotuloPorNome("Antigo")).salvar();
		} catch (ObraException e) {
			e.printStackTrace();
		}
	}
}
